Les données fournit étaient stocké dans un fichier excel que nous avons convertis en fichier csv plus pratique à importer dans R. L’importation des données se fait à l’aide de l’appel suivante :
Data <- read.csv("Car2DB_fra_cut.csv", sep = ";", encoding = "UTF-8", na.strings = c("", "NA", "#N/A", " "), dec = ",")
Pour la préparation des données, nous avons réaliser une fonction permettant dans un premier temps de nettoyer les noms de colonne à l’aide du package janitor. Ensuite nous avons fait en sorte de supprimer les colonnes ayant un nombre de valeurs manquantes supérieur à un cinquième du nombre d’observations dans le dataset. Dans notre cas nous enlèverons donc les colonnes ayant plus de 311 valeurs manquantes. Cela nous permet d’ensuite supprimer les lignes ayant des valeurs manquantes. Si nous avions supprimer les lignes ayant des valeurs manquantes sans gérer les précédentes colonnes, le dataset aurait été vide.
L’appel suivant permet de nettoyer nos données :
source("scripts/generalist_cleaning.R")
Data <- clean(Data)
Pour la suite du devoir, nous n’utiliserons que les variables suivantes :
data_utilise <- Data[c("cylindree_cm3", "puissance_de_moteur_ch", "longueur_mm", "largeur_mm", "poids_a_vide_kg", "vitesse_max_km_h")]
head(data_utilise)
## cylindree_cm3 puissance_de_moteur_ch longueur_mm largeur_mm poids_a_vide_kg
## 20 954 50 3525 1555 705
## 21 1124 60 3525 1555 691
## 22 1294 95 3525 1595 735
## 23 1361 75 3517 1596 820
## 25 1361 52 3525 1555 735
## 26 1361 95 3515 1595 795
## vitesse_max_km_h
## 20 151
## 21 167
## 22 186
## 23 165
## 25 155
## 26 186
Pour cette partie, nous avons réalisé une fonction nous permettant de centrer et réduire nos données.
source("scripts/centrer_reduire.R")
donnees <- centrer_reduire(data_utilise)
head(donnees)
## cylindree_cm3 puissance_de_moteur_ch longueur_mm largeur_mm poids_a_vide_kg
## 20 -1.7434287 -1.8609718 -2.309935 -2.579601 -2.117328
## 21 -1.4186591 -1.6241682 -2.309935 -2.579601 -2.164240
## 22 -1.0938896 -0.7953555 -2.309935 -2.087453 -2.016801
## 23 -0.9658921 -1.2689628 -2.332044 -2.075150 -1.731976
## 25 -0.9658921 -1.8136111 -2.309935 -2.579601 -2.016801
## 26 -0.9658921 -0.7953555 -2.337571 -2.087453 -1.815748
## vitesse_max_km_h
## 20 -1.801497275
## 21 -0.978614165
## 22 -0.001440472
## 23 -1.081474554
## 25 -1.595776497
## 26 -0.001440472
On peut comparer le résultat obtenu avec la fonction scale de R permettant de normaliser les données.
data_scale <- scale(data_utilise)
head(data_scale)
## cylindree_cm3 puissance_de_moteur_ch longueur_mm largeur_mm poids_a_vide_kg
## 20 -1.7434287 -1.8609718 -2.309935 -2.579601 -2.117328
## 21 -1.4186591 -1.6241682 -2.309935 -2.579601 -2.164240
## 22 -1.0938896 -0.7953555 -2.309935 -2.087453 -2.016801
## 23 -0.9658921 -1.2689628 -2.332044 -2.075150 -1.731976
## 25 -0.9658921 -1.8136111 -2.309935 -2.579601 -2.016801
## 26 -0.9658921 -0.7953555 -2.337571 -2.087453 -1.815748
## vitesse_max_km_h
## 20 -1.801497275
## 21 -0.978614165
## 22 -0.001440472
## 23 -1.081474554
## 25 -1.595776497
## 26 -0.001440472
Pour cette partie nous avons tout d’abord une fonction permettant de réaliser un nuage de points. Ensuite, pour faciliter le travail et aller plus vite, nous avons fait une fonction appelant la fonction nuageDePoints précédemment créée et réalisant une regression simple pour chaque couple de variables possibles.
source("scripts/correlation.R")
all_regression_simple(data_utilise)
## [1] "equation de la droite : 563.98 + 10.13 * puissance_de_moteur_ch + 301.81"
## [1] "coefficient de determination : 0.668"
## [1] "equation de la droite : -2431.02 + 0.99 * longueur_mm + 383.39"
## [1] "coefficient de determination : 0.464"
## [1] "equation de la droite : -6041.09 + 4.48 * largeur_mm + 376.16"
## [1] "coefficient de determination : 0.484"
## [1] "equation de la droite : -6.73 + 1.4 * poids_a_vide_kg + 315"
## [1] "coefficient de determination : 0.638"
## [1] "equation de la droite : -453.16 + 12.47 * vitesse_max_km_h + 464.15"
## [1] "coefficient de determination : 0.215"
## [1] "equation de la droite : 5.52 + 0.07 * cylindree_cm3 + 24.35"
## [1] "coefficient de determination : 0.668"
## [1] "equation de la droite : -220.24 + 0.08 * longueur_mm + 30.77"
## [1] "coefficient de determination : 0.47"
## [1] "equation de la droite : -552.16 + 0.39 * largeur_mm + 28.3"
## [1] "coefficient de determination : 0.551"
## [1] "equation de la droite : -11.64 + 0.1 * poids_a_vide_kg + 28.36"
## [1] "coefficient de determination : 0.549"
## [1] "equation de la droite : -166.78 + 1.59 * vitesse_max_km_h + 28.83"
## [1] "coefficient de determination : 0.534"
## [1] "equation de la droite : 3481.8 + 0.47 * cylindree_cm3 + 265.03"
## [1] "coefficient de determination : 0.464"
## [1] "equation de la droite : 3605.64 + 5.87 * puissance_de_moteur_ch + 263.62"
## [1] "coefficient de determination : 0.47"
## [1] "equation de la droite : -2163.73 + 3.7 * largeur_mm + 201.67"
## [1] "coefficient de determination : 0.69"
## [1] "equation de la droite : 3109.17 + 0.94 * poids_a_vide_kg + 230.04"
## [1] "coefficient de determination : 0.596"
## [1] "equation de la droite : 2387.51 + 10.61 * vitesse_max_km_h + 297.46"
## [1] "coefficient de determination : 0.325"
## [1] "equation de la droite : 1563 + 0.11 * cylindree_cm3 + 58.41"
## [1] "coefficient de determination : 0.484"
## [1] "equation de la droite : 1580.91 + 1.43 * puissance_de_moteur_ch + 54.47"
## [1] "coefficient de determination : 0.551"
## [1] "equation de la droite : 951.19 + 0.19 * longueur_mm + 45.3"
## [1] "coefficient de determination : 0.69"
## [1] "equation de la droite : 1434.94 + 0.25 * poids_a_vide_kg + 34.49"
## [1] "coefficient de determination : 0.82"
## [1] "equation de la droite : 1412.13 + 1.9 * vitesse_max_km_h + 72.48"
## [1] "coefficient de determination : 0.206"
## [1] "equation de la droite : 486.7 + 0.46 * cylindree_cm3 + 179.59"
## [1] "coefficient de determination : 0.638"
## [1] "equation de la droite : 663.28 + 5.24 * puissance_de_moteur_ch + 200.41"
## [1] "coefficient de determination : 0.549"
## [1] "equation de la droite : -1440.29 + 0.64 * longueur_mm + 189.72"
## [1] "coefficient de determination : 0.596"
## [1] "equation de la droite : -4530.88 + 3.33 * largeur_mm + 126.64"
## [1] "coefficient de determination : 0.82"
## [1] "equation de la droite : 352.64 + 5.29 * vitesse_max_km_h + 280.28"
## [1] "coefficient de determination : 0.119"
## [1] "equation de la droite : 153.91 + 0.02 * cylindree_cm3 + 17.24"
## [1] "coefficient de determination : 0.215"
## [1] "equation de la droite : 142.74 + 0.34 * puissance_de_moteur_ch + 13.27"
## [1] "coefficient de determination : 0.534"
## [1] "equation de la droite : 52.46 + 0.03 * longueur_mm + 15.98"
## [1] "coefficient de determination : 0.325"
## [1] "equation de la droite : -5.36 + 0.11 * largeur_mm + 17.34"
## [1] "coefficient de determination : 0.206"
## [1] "equation de la droite : 156 + 0.02 * poids_a_vide_kg + 18.26"
## [1] "coefficient de determination : 0.119"
Matrice de corrélation :
cor(data_utilise)
## cylindree_cm3 puissance_de_moteur_ch longueur_mm
## cylindree_cm3 1.0000000 0.8172517 0.6812528
## puissance_de_moteur_ch 0.8172517 1.0000000 0.6854168
## longueur_mm 0.6812528 0.6854168 1.0000000
## largeur_mm 0.6957913 0.7424665 0.8304828
## poids_a_vide_kg 0.7988961 0.7412638 0.7721745
## vitesse_max_km_h 0.4632038 0.7310604 0.5700047
## largeur_mm poids_a_vide_kg vitesse_max_km_h
## cylindree_cm3 0.6957913 0.7988961 0.4632038
## puissance_de_moteur_ch 0.7424665 0.7412638 0.7310604
## longueur_mm 0.8304828 0.7721745 0.5700047
## largeur_mm 1.0000000 0.9055963 0.4533558
## poids_a_vide_kg 0.9055963 1.0000000 0.3447143
## vitesse_max_km_h 0.4533558 0.3447143 1.0000000
Dans cette partie nous allons appliquer la méthode ACP et analyser les résultats sur les plans (1,2), (1,3) et (2,3). La méthode PCA() du package FactoMineR normalise automatiquement les données, il n’est donc pas nécessaire de réaliser cette transformation avant l’ACP.
La fonction ACP() que nous avons réalisé affiche le pourcentage d’information par axe via un graphe et retourne le résultat de la fonction PCA()
source("scripts/acp.R")
res.pca <- ACP(data_utilise)
Pour les questions 6, 7 et 8 nous allons les réaliser par plan.
fviz_pca_ind(res.pca, axes = c(1,2))
fviz_pca_var(res.pca, axes = c(1,2))
Le plan (1,2) nous montre 87.5% d’information ce qui est très bien. On remarque que les variables longueur_mm, cylindree_cm3, largeur_mm, poids_a_vide_kg et puissance_de_moteur_ch sont positivement corrélées les unes aux autres. En revanche poids_a_vide_kg et vitesse_max_km_h ne sont pas corrélées, on pouvait déjà le voir dans la partie précédente.
Au niveau de la typologie des véhicules on aurait :
Les ressemblances sont donc fondées sur la puissance du moteur, la longueur, la largeur, la cylindrée et le poids à vide.
fviz_pca_ind(res.pca, axes = c(1,3))
fviz_pca_var(res.pca, axes = c(1,3))
Le plan (1,3) nous montre 81.1% d’information ce qui est aussi très bien. On remarque que toutes les variables sont positivement corrélées sauf vitesse_max_km_h qui n’est pas assez bien représenté pour en conclure quelque chose.
La typologie des véhicules est similaire au plan précédant :
Les ressemblances sont aussi fondées sur les mêmes variables que précédemment, la puissance du moteur, la longueur, la largeur, la cylindrée et le poids à vide.
Ces similiratées avec le plan précédent sont dûes au fait que l’axe 1, commun aux deux plans, explique la quasi totalité des deux plans (74.2%).
fviz_pca_ind(res.pca, axes = c(2,3))
fviz_pca_var(res.pca, axes = c(2,3))
Ce plan nous donne très peu d’information, seulement 20.2%. Par ailleurs aucune variable n’est bien représenté dans le cercle des corrélations, on ne peut donc rien en conclure.
La fonction suivante nous permet d’avoir un graphe en 3D avec les trois premières dimensions:
library(plotly)
fig3d <- plot_ly(x = res.pca$ind$coord[,1],
y = res.pca$ind$coord[,2],
z = res.pca$ind$coord[,3])
fig3d <- fig3d %>% add_markers()
fig3d <- fig3d %>% layout(scene = list(xaxis = list(title = 'Dim 1'),
yaxis = list(title = 'Dim 2'),
zaxis = list(title = 'Dim 3')))
fig3d
Nous avons ensuite décidé d’utliser la méthode de K-means afin d’avoir trois groupes d’individus.
res.kmeans <- kmeans(res.pca$ind$coord, 3)
fig3d.kmeans <- plot_ly(x = res.pca$ind$coord[,1],
y = res.pca$ind$coord[,2],
z = res.pca$ind$coord[,3],
color=factor(res.kmeans$cluster))
fig3d.kmeans <- fig3d.kmeans %>% add_markers()
fig3d.kmeans <- fig3d.kmeans %>% layout(scene = list(xaxis = list(title = 'Dim 1'),
yaxis = list(title = 'Dim 2'),
zaxis = list(title = 'Dim 3')))
fig3d.kmeans
Pour cette dernière partie nous allons rajouté les variables garde_au_sol_mm, acceleration_0_100_km_h_seconde, couple_maximal_n_m et reservoir_l.
data_acp_sup <- Data[c("cylindree_cm3", "puissance_de_moteur_ch", "longueur_mm", "largeur_mm", "poids_a_vide_kg", "vitesse_max_km_h", "garde_au_sol_mm", "acceleration_0_100_km_h_seconde", "couple_maximal_n_m", "reservoir_l")]
head(data_acp_sup)
## cylindree_cm3 puissance_de_moteur_ch longueur_mm largeur_mm poids_a_vide_kg
## 20 954 50 3525 1555 705
## 21 1124 60 3525 1555 691
## 22 1294 95 3525 1595 735
## 23 1361 75 3517 1596 820
## 25 1361 52 3525 1555 735
## 26 1361 95 3515 1595 795
## vitesse_max_km_h garde_au_sol_mm acceleration_0_100_km_h_seconde
## 20 151 110 17.0
## 21 167 110 12.0
## 22 186 110 9.4
## 23 165 140 12.0
## 25 155 110 14.3
## 26 186 110 9.9
## couple_maximal_n_m reservoir_l
## 20 73 43
## 21 88 43
## 22 113 43
## 23 116 43
## 25 84 43
## 26 120 43
res.pca.sup <- ACP(data_acp_sup)
fviz_pca_ind(res.pca.sup, axes = c(1,2))
fviz_pca_var(res.pca.sup, axes = c(1,2), labelsize = 3)
Dans ce plan nous pouvons voir que les variables cylindree_cm3, puissance_de_moteur_ch, longueur_mm, largeur_mm, poids_a_vide_kg, reservoir_l et couple_maximal_n_m sont positivement corrélées, les variables vitesse_max_km_h et acceleration_0_100_km_h_seconde sont inversement corrélées et vitesse_max_km_h et garde_au_sol_mm ne sont pas corrélées.
res.kmeans.sup <- kmeans(res.pca.sup$ind$coord, 3)
fig3d.sup <- plot_ly(x = res.pca.sup$ind$coord[,1],
y = res.pca.sup$ind$coord[,2],
z = res.pca.sup$ind$coord[,3],
color=factor(res.kmeans.sup$cluster))
fig3d.sup <- fig3d.sup %>% add_markers()
fig3d.sup <- fig3d.sup %>% layout(scene = list(xaxis = list(title = 'Dim 1'),
yaxis = list(title = 'Dim 2'),
zaxis = list(title = 'Dim 3')))
fig3d.sup